package controller;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import modelo.Area;
import modelo.Caja;
import modelo.Carta;
import modelo.Cuenta;
import modelo.Deposito;
import modelo.Insumo;
import modelo.ItemCarta;
import modelo.ItemReceta;
import modelo.MedioPago;
import modelo.Mesa;
import modelo.Mozo;
import modelo.Plato;
import modelo.Receta;
import modelo.Restaurante;
import modelo.Rubro;
import modelo.Sector;

import entity.ComandaBD;
import entity.ItemComandaBD;
import entity.MesaBD;
import entity.PlatoBD;
import fachade.PrincipalFachade;

import beans.AreaBean;
import beans.CajaBean;
import beans.CartaBean;
import beans.CuentaBean;
import beans.DepositoBean;
import beans.InsumoBean;
import beans.ItemCartaBean;
import beans.ItemComandaBean;
import beans.ItemRecetaBean;
import beans.MedioPagoBean;
import beans.MesaBean;
import beans.MozoBean;
import beans.PlatoBean;
import beans.RecetaBean;
import beans.RestauranteBean;
import beans.RubroBean;
import beans.SectorBean;

public class MesaController {
	
	public MesaController(){
		
	}
	
	public List<RestauranteBean> getRestaurantes(){
		List<RestauranteBean> mozos = new LinkedList<RestauranteBean>();
		for (Restaurante restaurante: PrincipalFachade.getInstance().getRestaurantes()){
			mozos.add(this.convertResturanteModeloToBean(restaurante));
		}
		return mozos;
	}
	
	public List<MedioPagoBean> getMediosPago(){
		List<MedioPagoBean> mediosPago = new LinkedList<MedioPagoBean>();
		for (MedioPago medioPago: PrincipalFachade.getInstance().getMediosPago()){
			mediosPago.add(this.convertMedioPagoModeloToBean(medioPago));
		}
		return mediosPago;
	}
	
	public List<MozoBean> getMozosDeRestaurante(Integer restaurante){
		List<MozoBean> mozos = new LinkedList<MozoBean>();
		for (Iterator<Mozo> iterator = PrincipalFachade.getInstance().getMozos(restaurante).iterator(); iterator.hasNext();){
			Mozo mozo=(Mozo) iterator.next();
			mozos.add(this.convertMozoModeloToBean(mozo));
		}
		return mozos;
	}

	public List<MesaBean> getMesasPorEstado(String estado) {
		List<MesaBean> mesas = new LinkedList<MesaBean>();
		for (Iterator<Mesa> iterator = PrincipalFachade.getInstance().getMesasPorEstado(estado).iterator(); iterator.hasNext();) {
			Mesa mesa = (Mesa) iterator.next();
			mesas.add(this.convertMesaModeloToBean(mesa));
		}
		return mesas;
	}
	
	public List<MesaBean> getMesasDeMozo(Integer legajo) {
		List<MesaBean> mesas = new ArrayList<MesaBean>();
		for (Mesa m : PrincipalFachade.getInstance().getMesasDeMozo(legajo)) {
			if (m.getEstado().equalsIgnoreCase("libre")) {
				Mesa mesa = (Mesa) m;
				mesas.add(this.convertMesaModeloToBean(mesa));
			}
		}
		return mesas;
	}
	
	private RestauranteBean convertResturanteModeloToBean(Restaurante restaurante) {
		RestauranteBean r = new RestauranteBean();
		r.setNombre(restaurante.getNombre());
		r.setDireccion(restaurante.getDireccion());
		
		r.setDeposito(this.convertDepositoModeloToBean(restaurante.getDeposito()));
		r.setCaja(this.convertCajaModeloToBean(restaurante.getCaja()));
		r.setCarta(this.convertCartaModeloToBean(restaurante.getCarta()));
		
		if (r.getAreas()!=null) {
			for (Area area: restaurante.getAreas())
				r.getAreas().add(this.convertAreaModeloToBean(area));
		}
		
		if (r.getSectores()!=null){
			for (Sector sector: restaurante.getSectores())
				r.getSectores().add(this.convertSectorModeloToBean(sector));
		}
		
		if (r.getMozos()!=null){
			for (Mozo mozo: restaurante.getMozos())
				r.getMozos().add(this.convertMozoModeloToBean(mozo));
		}	
		
		return r;
	}
	
	private DepositoBean convertDepositoModeloToBean(Deposito deposito) {
		DepositoBean d = new DepositoBean();
		d.setNombre(deposito.getNombre());
		return d;
	}
	
	private CajaBean convertCajaModeloToBean(Caja caja) {
		CajaBean c = new CajaBean();
		c.setUltCierre(caja.getUltCierre());
		return c;
	}
	
	private MedioPagoBean convertMedioPagoModeloToBean(MedioPago medioPago) {
		MedioPagoBean mp = new MedioPagoBean();
		mp.setCodigo(medioPago.getCodigo());
		mp.setDescripcion(medioPago.getDescripcion());
		mp.setCuenta(this.convertCuentaModeloToBean(medioPago.getCuenta()));
		return mp;
	}
	
	private CuentaBean convertCuentaModeloToBean(Cuenta cuenta) {
		CuentaBean c = new CuentaBean();
		c.setCuentaId(cuenta.getCuentaId());
		c.setDescripcion(cuenta.getDescripcion());
		return c;
	}
	
	private CartaBean convertCartaModeloToBean(Carta carta) {
		CartaBean c = new CartaBean();
		c.setFechaDesde(carta.getFechaDesde());
		c.setFechaHasta(carta.getFechaHasta());
		if (c.getItemsCarta()!=null){
			for (ItemCarta item: carta.getItemsCarta())
				c.getItemsCarta().add(this.convertItemCartaModeloToBean(item));
		}
		return c;
	}
	
	private ItemCartaBean convertItemCartaModeloToBean(ItemCarta itemCarta) {
		ItemCartaBean ic = new ItemCartaBean();
		ic.setPrecio(itemCarta.getPrecio());
		ic.setRubro(this.convertRubroModeloToBean(itemCarta.getRubro()));
		ic.setPlato(this.convertPlatoModeloToBean(itemCarta.getPlato()));
		return ic;
	}
	
	private RubroBean convertRubroModeloToBean(Rubro rubro) {
		RubroBean r = new RubroBean();
		r.setCodigo(rubro.getCodigo());
		r.setDescripcion(rubro.getDescripcion());
		return r;
	}
	
	private PlatoBean convertPlatoModeloToBean(Plato plato) {
		PlatoBean p = new PlatoBean();
		p.setArea(this.convertAreaModeloToBean(plato.getArea()));
		p.setPorcComision(plato.getPorcComision());
		p.setDescripcion(plato.getDescripcion());
		p.setReceta(this.convertRecetaModeloToBean(plato.getReceta()));
		return p;
	}
	
	private RecetaBean convertRecetaModeloToBean(Receta receta) {
		RecetaBean r = new RecetaBean();
		r.setHorasElaboracion(receta.getHorasElaboracion());
		for (ItemReceta item: receta.getIngredientes()) {
			r.getIngredientes().add(this.convertItemRecetaModeloToBean(item));
		}
		r.setInstrucciones(receta.getInstrucciones());
		return r;
	}

	private ItemRecetaBean convertItemRecetaModeloToBean(ItemReceta itemReceta) {
		ItemRecetaBean i = new ItemRecetaBean();
		i.setCantidad(itemReceta.getCantidad());		
		i.setIngrediente(this.convertInsumoModeloToBean(itemReceta.getIngrediente()));
		return i;
	}

	private InsumoBean convertInsumoModeloToBean(Insumo insumo) {
		InsumoBean i = new InsumoBean();
		for (Iterator iterator = insumo.getSustitutos().iterator(); iterator
				.hasNext();) {
			InsumoBean insumo2 = (InsumoBean) iterator.next();
			i.getSustitutos().add(insumo2);			
		}
		return i;
	}
	
	private AreaBean convertAreaModeloToBean(Area area) {
		AreaBean a = new AreaBean();		
		return a;
	}
	
	private MozoBean convertMozoModeloToBean(Mozo mozo) {
		MozoBean m = new MozoBean();
		m.setLegajo(mozo.getLegajo());
		m.setNombre(mozo.getNombre());
		m.setPorcComision(mozo.getPorcComision());
		if(m.getSector() != null){
			m.setSector(this.convertSectorModeloToBean(mozo.getSector()));
		}
		return m;
	}
	
	private SectorBean convertSectorModeloToBean(Sector sector) {
		SectorBean s = new SectorBean();
		s.setNombre(sector.getNombre());
		if(s.getMesas() != null) {
			for (Mesa mesa: sector.getMesas()) 
				s.getMesas().add((this.convertMesaModeloToBean(mesa)));		
		}
		return s;
	}

	private MesaBean convertMesaModeloToBean(Mesa mesa) {
		MesaBean m = new MesaBean();
		m.setCantLugares(mesa.getCantLugares());
		m.setEstado(mesa.getEstado());
		m.setNumero(mesa.getNumero());
		if(mesa.getMesas()!=null)
			m.setMesas(this.convertMesaModeloToBean(mesa.getMesas()));
//		if(m.getMesas() != null){
//			for (Iterator<Mesa> iterator = mesa.getMesas().iterator(); iterator.hasNext();) {
//				Mesa mesa2 = (Mesa) iterator.next();
//				m.getMesas().add((this.convertMesaModeloToBean(mesa2)));
//			}
//		}
		return m;
	}
	
	public void registrarAperturaMesa(Integer legajo, Integer numeroMesa, Integer cantComensales) {
		PrincipalFachade.getInstance().registrarAperturaMesa(legajo, numeroMesa, cantComensales);
	}

	public void liberarMesa(Integer restaurante, Integer mesa) {
		PrincipalFachade.getInstance().liberarMesa(restaurante, mesa);
	}
	
	public void generarFactura(Integer mesa, Integer medioPago){
		// TODO Auto-generated method stub
		PrincipalFachade.getInstance().generarFactura(mesa, medioPago);
	}

	public void cerrarMesa(Integer restaurante, Integer mesa) {
		// TODO Auto-generated method stub
		PrincipalFachade.getInstance().cerrarMesa(restaurante, mesa);
		
	}
	
	public Float calcularTotalMesa(Integer restaurante, Integer mesa){
		// TODO Auto-generated method stub
		return PrincipalFachade.getInstance().calcularTotalMesa(restaurante, mesa);
	}

	public void generarComandas(Integer numeroMesa,
			List<ItemComandaBean> itemsComanda) {
		List<ItemComandaBD> itemsAEnviarCocina = new LinkedList<ItemComandaBD>();
		List<ItemComandaBD> itemsAEnviarBarra = new LinkedList<ItemComandaBD>();
		List<ItemComandaBD> itemsAEnviarCafeteria = new LinkedList<ItemComandaBD>();
		
		MesaBD mesa = PrincipalFachade.getInstance().buscarMesa(numeroMesa);
		
		for (Iterator iterator = itemsComanda.iterator(); iterator.hasNext();) {
			ItemComandaBean itemComandaBean = (ItemComandaBean) iterator.next();
			PlatoBD p = PrincipalFachade.getInstance().getPlato(itemComandaBean.getPlato().getIdPlato());
			
			ItemComandaBD tmpItem = new ItemComandaBD();
			tmpItem.setCantidad(itemComandaBean.getCantidad());
			tmpItem.setPlato(p);
			
			if(p.getArea().getNombre().equalsIgnoreCase("cafeteria"))
				itemsAEnviarCafeteria.add(tmpItem);
			else if(p.getArea().getNombre().equalsIgnoreCase("barra"))
				itemsAEnviarBarra.add(tmpItem);
			else if(p.getArea().getNombre().equalsIgnoreCase("cocina"))
				itemsAEnviarCocina.add(tmpItem);
		}
		if(itemsAEnviarBarra.size()>0){
			ComandaBD c = new ComandaBD();
			c.setItemsComanda(itemsAEnviarBarra);
			c.setArea(c.getItemsComanda().get(0).getPlato().getArea());
			c.setMesa(mesa);
			PrincipalFachade.getInstance().generarComanda(c);
			c.setItemsComanda(itemsAEnviarBarra);
			for (int i = 0; i < c.getItemsComanda().size(); i++) {
				ItemComandaBD itemComandaBD = (ItemComandaBD) c.getItemsComanda().get(i);
				itemComandaBD.setIdComanda(c.getIdComanda());
				itemComandaBD.setIdRenglonItemComanda(i+1);
				PrincipalFachade.getInstance().generarItemComanda(itemComandaBD);	
			}

		}
		if(itemsAEnviarCocina.size()>0){
			ComandaBD c = new ComandaBD();
			c.setArea(itemsAEnviarCocina.get(0).getPlato().getArea());
			c.setMesa(mesa);
			PrincipalFachade.getInstance().generarComanda(c);
			c.setItemsComanda(itemsAEnviarCocina);
			for (int i = 0; i < c.getItemsComanda().size(); i++) {
				ItemComandaBD itemComandaBD = (ItemComandaBD) c.getItemsComanda().get(i);
				itemComandaBD.setIdComanda(c.getIdComanda());
				itemComandaBD.setIdRenglonItemComanda(i+1);
				PrincipalFachade.getInstance().generarItemComanda(itemComandaBD);	
			}
			
		}
		if(itemsAEnviarCafeteria.size()>0){
			ComandaBD c = new ComandaBD();
			c.setItemsComanda(itemsAEnviarCafeteria);
			c.setArea(c.getItemsComanda().get(0).getPlato().getArea());
			c.setMesa(mesa);
			PrincipalFachade.getInstance().generarComanda(c);
			c.setItemsComanda(itemsAEnviarCafeteria);
			for (int i = 0; i < c.getItemsComanda().size(); i++) {
				ItemComandaBD itemComandaBD = (ItemComandaBD) c.getItemsComanda().get(i);
				itemComandaBD.setIdComanda(c.getIdComanda());
				itemComandaBD.setIdRenglonItemComanda(i+1);
				PrincipalFachade.getInstance().generarItemComanda(itemComandaBD);	
			}

		}
		
	}

	private PlatoBean convertPlatoBdToBean(PlatoBD plato) {
		PlatoBean p = new PlatoBean();
		p.setIdPlato(plato.getIdPlato());
		p.setDescripcion(plato.getDescripcion());
		return p;
	}

}
